package org.lora.quartz;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.lora.exception.LoraCoreException;
import org.lora.quartz.entity.SchedulerInfo;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;

/**
 * <p>
 * 类名:IQuartzService
 * </p>
 * 描述:Quartz服务<br>
 * 创建时间:2016年11月8日 下午4:01:23<br>
 * 
 * @author Bladnir@outlook.com<br>
 *         修改历史:<br>
 *         2016年11月8日 Bladnir 创建<br>
 */
public interface IQuartzService {

	/**
	 * 启动调度器框架
	 * 
	 * @throws SchedulerException
	 * @throws LoraCoreException
	 */
	public void initialize() throws SchedulerException;

	/**
	 * 获取调度器实例（唯一）
	 * 
	 * @return
	 */
	public Scheduler getScheduler();

	/**
	 * 获取调度器状态数据
	 * 
	 * @return
	 * @throws SchedulerException
	 */
	public SchedulerInfo getSchedulerState() throws SchedulerException;

	/**
	 * 启动调度器
	 * 
	 * @throws SchedulerException
	 */
	public void start() throws SchedulerException;

	/**
	 * 停止调度器
	 * 
	 * @throws SchedulerException
	 */
	public void shutdown() throws SchedulerException;

	/**
	 * 暂停所有任务
	 * 
	 * @throws SchedulerException
	 */
	public void pauseAll() throws SchedulerException;

	/**
	 * 恢复所有任务
	 * 
	 * @throws SchedulerException
	 */
	public void resumeAll() throws SchedulerException;

	/**
	 * 构建周期触发器
	 * 
	 * @param name
	 *            触发器名称
	 * @param gourp
	 *            触发器群组
	 * @param cronExpression
	 *            cron表达式 eg:0/20 * * * * ? 表示每隔20s执行一次，具体请查看cron
	 * @return CronTrigger 返回触发器描述
	 * @throws SchedulerException
	 *             SchedulerException
	 */
	public CronTrigger bulidCronTrigger(String name, String gourp, String cronExpression) throws SchedulerException;

	/**
	 * 构建间隔触发器
	 * 
	 * @param name
	 *            触发器名称
	 * @param group
	 *            触发器群组
	 * @param startTime
	 *            开始执行时间
	 * @param stopTime
	 *            任务结束时间
	 * @param repeatInterval
	 *            间隔时间，单位秒
	 * @return 间隔出发器
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public SimpleTrigger bulidSimpleTrigger(String name, String group, Date startTime, Date stopTime, int repeatInterval)
			throws SchedulerException;

	/**
	 * 构建任务描述，注意这里并不直接存储，在schedule方法存储
	 * 
	 * @param jobName
	 *            任务名称
	 * @param jobGroup
	 *            任务群组
	 * @param jobClass
	 *            需要调用类，需实现org.quartz.Job
	 * @return JobDetail 返回任务描述
	 * @throws SchedulerException
	 *             SchedulerException
	 * @see Job
	 */
	public JobDetail bulidJob(String jobName, String jobGroup, Class<? extends Job> jobClass) throws SchedulerException;

	/**
	 * 绑定任务与触发器--一对一关系
	 * 
	 * @param jobDetail
	 *            一个任务
	 * @param trigger
	 *            一个触发器
	 * @param replace
	 *            是否替换，true 为替换 false为不替换
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public void blindJobAndTrigger(JobDetail jobDetail, Trigger trigger, boolean replace) throws SchedulerException;

	/**
	 * 绑定任务与触发器--一对多关系
	 * 
	 * @param triggersAndJobs
	 *            键值对，一个任务对应多个(List)触发器
	 * @param replace
	 *            是否替换，true 为替换 false为不替换
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public void blindJobAndTrigger(Map<JobDetail, List<Trigger>> triggersAndJobs, boolean replace) throws SchedulerException;

	/**
	 * 立即执行任务
	 * 
	 * @param jobName
	 *            任务名称
	 * @param jobGroup
	 *            任务组
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public void executeNow(String jobName, String jobGroup) throws SchedulerException;

	/**
	 * 获取触发器
	 * 
	 * @param triggerName
	 *            触发器名称
	 * @param triggerGroupName
	 *            触发器组名称
	 * @return 触发器实体
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public Trigger getQrtzTrigger(String triggerName, String triggerGroupName) throws SchedulerException;

	/**
	 * 根据名称和组别暂停触发器
	 * 
	 * @param triggerName
	 *            触发器名称
	 * @param triggerGroupName
	 *            触发器组名称
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public void pauseTrigger(String triggerName, String triggerGroupName) throws SchedulerException;

	/**
	 * 恢复触发器
	 * 
	 * @param triggerName
	 *            触发器名称
	 * @param triggerGroupName
	 *            触发器组名称
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public void resumeTrigger(String triggerName, String triggerGroupName) throws SchedulerException;

	/**
	 * 删除触发器
	 * 
	 * @param triggerName
	 *            触发器名称
	 * @param triggerGroupName
	 *            触发器组名称
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public void removeTrigger(String triggerName, String triggerGroupName) throws SchedulerException;

	/**
	 * 获取触发器状态
	 * 
	 * @param triggerName
	 *            触发器名称
	 * @param triggerGroupName
	 *            触发器组
	 * @return 触发器状态
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public String getTriggerState(String triggerName, String triggerGroupName) throws SchedulerException;

	/**
	 * 判断是否存在触发器
	 * 
	 * @param triggerName
	 *            触发器名称
	 * @param triggerGroup
	 *            触发器组
	 * @return 是否存在
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public boolean checkTriggerExists(String triggerName, String triggerGroup) throws SchedulerException;

	/**
	 * 获取quartz的job对象
	 * 
	 * @param jobName
	 *            任务名称
	 * @param jobGroup
	 *            任务组
	 * @return 任务实体
	 * @throws SchedulerException
	 *             调度器异常
	 * 
	 */
	public JobDetail getQrtzJob(String jobName, String jobGroup) throws SchedulerException;

	/**
	 * 删除任务信息
	 * 
	 * @param jobName
	 *            任务名称
	 * @param jobGroup
	 *            任务组
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public void deleteJob(String jobName, String jobGroup) throws SchedulerException;

	/**
	 * 根据job获取触发器
	 * 
	 * @param jobName
	 *            任务名称
	 * @param jobGroup
	 *            任务组
	 * @return
	 * @throws SchedulerException
	 *             调度器异常
	 */
	public List<Trigger> getTriggersFromJob(String jobName, String jobGroup) throws SchedulerException;

}
